
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.sele.view.mbean;

import com.brain.core.view.mbean.*;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.util.ConstantesCore;
import com.brain.sele.dto.RequerimientoDto;
import com.brain.sele.manager.RequerimientoManager;
import com.brain.sele.view.util.ConstantesSele;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Hvives
 */
@Controller("requerimientoMBean")
@Scope("session")
public class RequerimientoMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(RequerimientoMBean.class);
    @Resource
    private RequerimientoManager manager;
    @Resource
    private RecursosManager recursosManager;
    private List<RequerimientoDto> lista;
    private RequerimientoDto dto;
    private RequerimientoDto dtoFiltro;
    private String keyTitulo = "requerimiento.panel";
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<ParametroDto> listaEstadosRequerimientoFiltro;
    private List<ParametroDto> listaSedesFiltro;
    private List<ParametroDto> listaSedesNuevo;
    private List<ParametroDto> listaModContratacion;
    private SelectItem[] siRequerimientoPrioridad;
    private boolean accesoAnular;
    private boolean accesoAprobar;
    private boolean accesoRechazar;
    private boolean accesoGuardar;

    public RequerimientoMBean() {
        this.dtoFiltro = new RequerimientoDto();
    }

    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new RequerimientoDto();
        this.dtoFiltro.setSedeDto(new ParametroDto());
        return ConstantesSele.UrlNavegacion.URL_LISTA_REQUERIMIENTO;
    }

    public String nuevo() {
        sessionMBean.setAccion(ConstantesSele.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.lista = new ArrayList<RequerimientoDto>();
        this.dto = manager.inicializar();
        gestionAcceso();
        return ConstantesSele.UrlNavegacion.URL_REQUERIMIENTO;
    }

    public String editar() {
        sessionMBean.setAccion(ConstantesSele.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));        
        gestionAcceso();
        if(this.dto.getConvocatoriaDto()!=null){
            showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("requerimiento.mensaje.asociada.convocatoria") + " " + this.dto.getConvocatoriaDto().getDescripcion());
        }
        return ConstantesSele.UrlNavegacion.URL_REQUERIMIENTO;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesSele.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        gestionAcceso();
        return ConstantesSele.UrlNavegacion.URL_REQUERIMIENTO;
    }

    public void gestionAcceso() {
        this.accesoAnular = false;
        this.accesoAprobar = false;
        this.accesoRechazar = false;
        this.accesoGuardar = true;
        if (dto.getId() != null) {
            if (dto.getEstadoDto().getValorEntero() == 1L) {//Solicitado
                this.accesoAnular = true;
                this.accesoAprobar = true;
                this.accesoRechazar = true;
                this.accesoGuardar = true;
            } else {
                this.accesoAnular = false;
                this.accesoAprobar = false;
                this.accesoRechazar = false;
                this.accesoGuardar = false;
            }

            //Si la accion es = VER
            if (sessionMBean.getAccion() == 3) {
                this.accesoAnular = false;
                this.accesoAprobar = false;
                this.accesoRechazar = false;
                this.accesoGuardar = false;
            }
        }
    }

    public void buscar(ActionEvent ae) {

        try {
            this.lista = this.manager.obtenerRequerimientos(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }

    }

    public String guardar() {
        RequerimientoDto responseDto = this.manager.guardar(this.dto);
        if (responseDto != null) {
            this.dtoFiltro.setId(responseDto.getId());
            return retroceder();
        }
        return "";
    }

    public String back() {
        this.dtoFiltro = new RequerimientoDto();       
        this.dtoFiltro.setId(this.dto.getId());
        buscar(null);
        sessionMBean.setAccion(applicationMBean.getLista());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return ConstantesSele.UrlNavegacion.URL_LISTA_REQUERIMIENTO;
    }
    
    public String retroceder() {
        buscar(null);
        sessionMBean.setAccion(ConstantesSele.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return ConstantesSele.UrlNavegacion.URL_LISTA_REQUERIMIENTO;
    }

    public String anular() {
        this.dto.setFechaAnulacion(UtilCore.Fecha.obtenerFechaActualDate());
        this.dto.setUsuarioAnulacion(sessionMBean.getSessionUsuarioDto().getId());
        this.dto.setEstadoDto(new ParametroDto(ConstantesSele.Parametro.REQ_ESTADO_ANULADO));
        guardar();
        return ConstantesSele.UrlNavegacion.URL_LISTA_REQUERIMIENTO;
    }

    public String rechazar() {
        this.dto.setFechaRechazado(UtilCore.Fecha.obtenerFechaActualDate());
        this.dto.setUsuarioRechazado(sessionMBean.getSessionUsuarioDto().getId());
        this.dto.setEstadoDto(new ParametroDto(ConstantesSele.Parametro.REQ_ESTADO_RECHAZADO));
        guardar();
        return ConstantesSele.UrlNavegacion.URL_LISTA_REQUERIMIENTO;
    }

    public String aprobar() {
        this.dto.setFechaAprobacion(UtilCore.Fecha.obtenerFechaActualDate());
        this.dto.setUsuarioAprobacion(sessionMBean.getSessionUsuarioDto().getId());
        this.dto.setEstadoDto(new ParametroDto(ConstantesSele.Parametro.REQ_ESTADO_APROBADO));
        guardar();
        return ConstantesSele.UrlNavegacion.URL_LISTA_REQUERIMIENTO;
    }

    public RequerimientoDto getDto() {
        return dto;
    }

    public void setDto(RequerimientoDto dto) {
        this.dto = dto;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<RequerimientoDto> getLista() {
        return lista;
    }

    public void setLista(List<RequerimientoDto> lista) {
        this.setLista(lista);
    }

    public RequerimientoManager getManager() {
        return manager;
    }

    public void setManager(RequerimientoManager manager) {
        this.manager = manager;
    }

    public RequerimientoDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(RequerimientoDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public List<ParametroDto> getListaEstadosRequerimientoFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesSele.CatalogoParametro.REQUERIMIENTO_ESTADOS, ConstantesCore.Parametro.TODOS);
    }

    public void setListaEstadosRequerimientoFiltro(List<ParametroDto> listaEstadosRequerimientoFiltro) {
        this.listaEstadosRequerimientoFiltro = listaEstadosRequerimientoFiltro;
    }

    public List<ParametroDto> getListaSedesFiltro() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesSele.CatalogoParametro.SEDES, ConstantesCore.Parametro.TODOS);
    }

    public void setListaSedesFiltro(List<ParametroDto> listaSedesFiltro) {
        this.listaSedesFiltro = listaSedesFiltro;
    }

    public List<ParametroDto> getListaSedesNuevo() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesSele.CatalogoParametro.SEDES);
    }

    public void setListaSedesNuevo(List<ParametroDto> listaSedesNuevo) {
        this.listaSedesNuevo = listaSedesNuevo;
    }

    public List<ParametroDto> getListaModContratacion() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesSele.CatalogoParametro.MODALIDA_CONTRATACION);
    }

    public void setListaModContratacion(List<ParametroDto> listaModContratacion) {
        this.listaModContratacion = listaModContratacion;
    }

    public SelectItem[] getSiRequerimientoPrioridad() {
        return manager.siRequerimientoPrioridad();
    }

    public void setSiRequerimientoPrioridad(SelectItem[] siRequerimientoPrioridad) {
        this.siRequerimientoPrioridad = siRequerimientoPrioridad;
    }

    public boolean isAccesoAnular() {
        return accesoAnular;
    }

    public void setAccesoAnular(boolean accesoAnular) {
        this.accesoAnular = accesoAnular;
    }

    public boolean isAccesoAprobar() {
        return accesoAprobar;
    }

    public void setAccesoAprobar(boolean accesoAprobar) {
        this.accesoAprobar = accesoAprobar;
    }

    public boolean isAccesoRechazar() {
        return accesoRechazar;
    }

    public void setAccesoRechazar(boolean accesoRechazar) {
        this.accesoRechazar = accesoRechazar;
    }

    public boolean isAccesoGuardar() {
        return accesoGuardar;
    }

    public void setAccesoGuardar(boolean accesoGuardar) {
        this.accesoGuardar = accesoGuardar;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
}
